import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // 进度条
import 'nprogress/nprogress.css' // 进度条样式
import { getToken } from '@/utils/token' // Token
import getPageTitle from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false }) // 进度条配置

const whiteList = ['/login', '/forget'] // 免登录白名单页面

/**
 *  router.beforeEach 是全局钩子函数，它是在路由跳转之前所调用的函数，
 * 在实际开发中页面进度条的加载、设置页面标题、判断用户是否已经登录过了等等都可以在该函数中执行。
 *
 * @param to 表示即将进入的路由对象
 * @param from 表示当前即将离开的路由对象
 * @param next 通过该函数可以重新定义要跳转的路由路径。常用示例：next({ path: '/' }) 表示跳转到主页
 */
router.beforeEach(async(to, from, next) => {
  // 开始进度条
  NProgress.start()
  // 设置页面标题
  document.title = getPageTitle(to.meta.title)

  // 获取网站配置信息
  store.dispatch('app/getSetting')

  // 获取用户token
  const hasToken = getToken()
  // 判断用户是否登录
  if (hasToken) {
    if (to.path === '/login' || to.path === '/forget') {
      // 如果已登录，跳转到主页
      next({ path: '/' })
      NProgress.done() // 进度条完成
    } else {
      // 确定用户信息是否存在
      if (store.getters.isAdmin) {
        // 当前页面处理
        const path_arr = to.path.trim().split('/')
        if (path_arr[1] != '') {
          store.state.user.top_menu_active = '/' + path_arr[1]
          // 获取当前左侧菜单
          store.state.user.routes.forEach((m, i) => {
            if (m.path == '/' + path_arr[1] && m.children && m.children.length > 0) {
              store.state.user.routes_menu = m.children
            }
          })
        }
        // 按钮权限处理
        let btn_common = ''
        if (path_arr.length > 0) {
          for (var i = 1; i < path_arr.length; i++) {
            btn_common += path_arr[i] + '_'
          }
        }
        store.state.user.btn_common = btn_common
        next()
      } else {
        try {
          // 获取用户信息
          const info = await store.dispatch('user/getInfo')

          // 当前页面处理
          const path_arr = to.path.trim().split('/')
          if (path_arr[1] != '') {
            store.state.user.top_menu_active = '/' + path_arr[1]
            // 获取当前左侧菜单
            store.state.user.routes.forEach((m, i) => {
              if (m.path == '/' + path_arr[1] && m.children && m.children.length > 0) {
                store.state.user.routes_menu = m.children
              }
            })
          }

          // 按钮权限处理
          let btn_common = ''
          if (path_arr.length > 0) {
            for (var i = 1; i < path_arr.length; i++) {
              btn_common += path_arr[i] + '_'
            }
          }
          store.state.user.btn_common = btn_common

          // 设置replace:true，这样导航就不会留下历史记录
          next({ ...to, replace: true })
        } catch (error) {
          // 删除token并跳转到登录页重新登录
          await store.dispatch('user/resetToken')
          Message.error(error || '参数错误！')
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else {
    // 没有令牌token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单中，直接进入
      next()
    } else {
      // 其他没有访问权限的页面将重定向到登录页面。
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  NProgress.done()
})
